package demo8

import (
	"fmt"
	"time"
)

/*
	定点计时, 使用 timer.NewTimer() 和 time.NewTicker()。
	1. 计时器（Timer）的原理和倒计时闹钟类似，都是给定多少时间后触发。
	2. 打点器（Ticker）的原理和钟表类似，钟表每到整点就会触发。
	3. 这两种方法创建后会返回 time.Ticker 对象和 time.Timer 对象，
		里面通过一个 C 成员，类型是只能接收的时间通道（<-chan Time），使用这个通道就可以获得时间触发的通知。
*/

// TestDemo814 创建一个打点器，每 500 毫秒触发一起；创建一个计时器，2 秒后触发，只触发一次。
func TestDemo814() {
	// 创建一个打点器，每 500ms 触发一次
	ticker := time.NewTicker(time.Millisecond * 500)

	// 创建一个计时器，2s 后触发
	stopper := time.NewTimer(time.Second * 2)

	// 声明技术变量
	var i int

	// for 循环查看通道情况
	for {
		// 多路复用通道
		// 每次触发后，select 会结束，需要使用循环再次从打点器返回的通道中获取触发通知。
		select {
		// 计时器时间到
		case <-stopper.C:
			fmt.Println("stop")
			// 跳出循环
			goto StopHere
		// 打点器触发
		case <-ticker.C:
			// 记录触发的次数
			i++
			fmt.Println("tick", i)
		}
	}

	// 退出的标签，使用 goto 跳转
StopHere:
	fmt.Println("done")
}
